// // /app.js
import config from '/utils/config.js';
import initializeDebugTools from '/utils/debug.js';

App({
  /**
   * 小程序初始化完成时触发，全局只触发一次
   */
  onLaunch() {
    // 这里可以写一些全局的初始化，例如获取系统信息等，但现在我们保持为空。
    console.log('App Launch');
  },

  /**
   * 全局登录状态检查函数
   * 这个函数将成为我们所有需要权限的页面的“守门员”
   * @returns {Promise<boolean>} - 返回一个 Promise，成功时 resolve(true)，失败时 resolve(false)
   */
  checkLoginStatus() {
    return new Promise((resolve) => {
      const token = wx.getStorageSync('token');
      if (!token) {
        resolve(false); // Token 不存在，直接判定为未登录
        return;
      }

      // 如果 Token 存在，我们还需要向后端验证它是否有效
      this.request({
        url: '/api/app/profile/me',
        method: 'GET'
      }).then(userProfile => {
        // Token 有效，将最新的用户信息存入全局
        this.globalData.userInfo = userProfile;
        console.log("app.js -> checkLoginStatus -> this.globalData.userInfo ==> ",this.globalData.userInfo);
        this.globalData.userInfo.avatar_url = this.globalData.config.baseUrl + this.globalData.userInfo.avatar_url;
        resolve(true); // 判定为已登录
      }).catch(err => {
        // Token 无效或过期
        wx.removeStorageSync('token'); // 清理掉无效的 token
        this.globalData.userInfo = null; // 清理全局用户信息
        resolve(false); // 判定为未登录
      });
    });
  },

  /**
   * 全局可靠登录守卫函数
   * 调用此函数，将确保用户处于登录状态。
   * 如果未登录，会自动引导至登录页。
   * @returns {Promise<boolean>} - 返回一个 Promise，用户已登录时 resolve(true)，因未登录而跳转时 resolve(false)。
   */
  async ensureLoggedIn() {
    // 调用我们已有的、可靠的后端验证函数
    const isLoggedIn = await this.checkLoginStatus();

    if (isLoggedIn) {
      // 1. 如果验证结果为 true，说明用户已登录且状态有效。
      // 直接返回 true，让上层函数继续执行。
      return true;
    } else {
      // 2. 如果验证结果为 false，说明用户未登录或 Token 已失效。
      // 调用全局的跳转函数，引导用户去登录。
      this.redirectToLogin();
      // 同时返回 false，让上层函数可以根据返回值决定是否要中断后续操作。
      return false;
    }
  },
 /**
   * 全局跳转到登录页的函数
   * 封装这个函数可以方便在任何地方统一调用
   */
  redirectToLogin() {
    wx.showToast({
      title: '请先登录',
      icon: 'none',
      duration: 500
    });
    setTimeout(() => {
      wx.navigateTo({ // 使用 navigateTo 而不是 reLaunch，方便用户登录后返回
        url: '/pages/login/login' // 你的登录页路径
      });
    }, 500);
  },
  /**
   * 【新增】全局网络请求函数
   * @param {object} options - wx.request 的参数对象，但 url 只需提供相对路径
   * @returns {Promise} - 返回一个 Promise 对象，可以用 .then() 和 .catch() 处理
   */
  request(options) {
    return new Promise((resolve, reject) => {
      // 1. 自动拼接完整的请求 URL
      const request_url = config.baseUrl + options.url;
      console.log("app.js -> request -> request_url ==> ",request_url);
      const token = wx.getStorageSync('token');

      wx.request({
        ...options, // 传入的 method, data 等参数
        url: request_url,
        header: {
          ...options.header,
          // 2. 自动携带 Token
          'Authorization': token ? `Bearer ${token}` : ''
        },
        success: (res) => {
          // 3. 统一处理 HTTP 状态码
          if (res.statusCode >= 200 && res.statusCode < 300) {
            // 请求成功，将后端返回的数据 resolve 出去
            resolve(res.data);
          } else {
            // 4. 统一处理业务错误（如 401, 404, 500 等）
            if (res.statusCode === 401) {
              // 如果因为 Token 过期而返回 401，您的应用都会自动拦截这个错误，清理无效的登录信息，并把用户带到登录页。
              wx.removeStorageSync('token'); // 清理掉无效的 token
              this.globalData.userInfo = null; // 清理全局用户信息
              wx.showToast({ title: '登录已过期，请重新登录', icon: 'none' });
              setTimeout(() => {
                this.redirectToLogin();
              }, 1500);
            }
            else
            {
              // 从后端返回的数据中尝试获取错误信息
              const msg = res.data.detail || `请求失败 (${res.statusCode})`;
              wx.showToast({ title: msg, icon: 'none' });
              // 将完整的响应对象 reject 出去，方便调试
            }
            reject(res);
          }``
        },
        fail: (err) => {
          // 5. 统一处理网络连接失败等问题
          wx.showToast({ title: '网络错误，请稍后重试', icon: 'error' });
          reject(err);
        }
      });
    });
  },
  /**
   * 全局文件上传函数
   * @param {object} options - wx.uploadFile 的参数对象
   * @returns {Promise}
   */
  upload(options) {
    return new Promise((resolve, reject) => {
      // 1. 自动拼接完整的请求 URL
      const upload_url = config.baseUrl + options.url;
      console.log("app.js -> upload_url -> upload_url ==> ",upload_url);
      const token = wx.getStorageSync('token');

      wx.uploadFile({
        ...options, // 传入的 filePath, name 等参数
        url: upload_url,
        header: {
          ...options.header,
          // 2. 自动携带 Token
          'Authorization': token ? `Bearer ${token}` : ''
        },
        success: (res) => {
          // 3. 统一处理 HTTP 状态码
          if (res.statusCode >= 200 && res.statusCode < 300) {
            // 注意: uploadFile 返回的 res.data 是字符串，需要手动 JSON.parse
            try {
              const parsedData = JSON.parse(res.data);
              resolve(parsedData); // 请求成功，将后端返回的数据 resolve 出去
            } catch (e) {
              wx.showToast({ title: '服务器返回数据格式错误', icon: 'none' });
              reject({ message: 'JSON parse error', originalData: res.data });
            }
          } else {
            // 4. 统一处理业务错误（逻辑与 request 函数保持一致）
            if (res.statusCode === 401) {
              wx.removeStorageSync('token');
              this.globalData.userInfo = null;
              wx.showToast({ title: '登录已过期，请重新登录', icon: 'none' });
              setTimeout(() => {
                this.redirectToLogin();
              }, 1500);
            } else {
              const msg = `上传失败 (${res.statusCode})`;
              wx.showToast({ title: msg, icon: 'none' });
            }
            reject(res);
          }
        },
        fail: (err) => {
          // 5. 统一处理网络连接失败等问题
          wx.showToast({ title: '网络错误，上传失败', icon: 'error' });
          reject(err);
        }
      });
    });
  },
  // 全局数据对象
  globalData: {
    userInfo: null,
    // 将配置也挂载到全局，方便在任何页面通过 getApp().globalData.config 访问
    config: config 
  }
});

if (config.env === 'development') {
  console.log('当前API地址:', config.baseUrl);
  initializeDebugTools(); // 执行调试工具的初始化
}